/**    
 * 文件名：Ex9ImageComparator.java    
 *    
 * 版本信息：    
 * 日期：2014年3月10日    
 * xyj 足下 xyj 2014     
 * 版权所有    
 *    
 */
package opencvtest.chapter04;

import static com.googlecode.javacv.cpp.opencv_highgui.CV_LOAD_IMAGE_COLOR;
import static opencvtest.OpenCVUtils.loadOrExit;
import static opencvtest.OpenCVUtils.show;

import java.io.File;
import java.text.MessageFormat;

import com.googlecode.javacv.cpp.opencv_core.IplImage;

/**
 * @项目名称：opencv-test
 * @类名称：Ex9ImageComparator
 * @类描述：
 * @创建人：zhuyi
 * @创建时间：2014年3月10日 下午5:05:44
 * @修改人：zhuyi
 * @修改时间：2014年3月10日 下午5:05:44
 * @修改备注：
 * @version
 * 
 */
public class Ex9ImageComparator {

    public static void main(String[] args) throws Exception {

        File referenceImageFile = new File("data/waves.jpg");

        File[] testImageFiles = new File[] { new File("data/waves.jpg"), new File("data/beach.jpg"),
                new File("data/dog.jpg"), new File("data/polar.jpg"), new File("data/bear.jpg"),
                new File("data/lake.jpg"), new File("data/moose.jpg") };

        // Load reference image
        IplImage reference = loadOrExit(referenceImageFile, CV_LOAD_IMAGE_COLOR);

        // Setup comparator
        ImageComparator comparator = new ImageComparator(reference);

        // Show reference image after color reduction done by `ImageComparator`
        show(comparator.referenceImage, "Reference");

        // Compute similarity for test images
        for (File file : testImageFiles) {
            IplImage image = loadOrExit(file, CV_LOAD_IMAGE_COLOR);
            int imageSize = image.width() * image.height();
            // Compute histogram match and normalize by image size.
            // 1 means perfect match.
            double score = comparator.compare(image) / imageSize;
            System.out.println(score);
            System.out.println(MessageFormat.format(file.getName() + ", score: {0,number,#.##}", score));
            show(image, MessageFormat.format(file.getName() + ", score: {0,number,#.##}", score));
        }

    }
}
